<?php

namespace Yhb\example;

use Yhb\config\SignConfig;
use Yhb\config\PayConfig;
use Yhb\sign\RSAUtil;
use Yhb\util\YhbUtil;
use Yhb\model\ApiResource;

require ("../init.php");

class PayExample extends ApiResource
{

    /**
     * 下单
     */
    public function orderCreate(){
        $this->initSignConfig();

        // 分账明细
        $splitDetails_data=array(
        // 分账系统申请的二级商户Id 替换为真实的数值
        'merchantId'=>1002,
        // 分账金额 单位：元 保留2位小数
        'splitAmt'=>0.80,
        );

        $req_data=array(
            // 商户系统内部订单号，要求64个字符内，只能是数字、大小写字母_-|* 且在同一个商户号下唯一
            'merchant_order_no'=>YhbUtil::createUniqid(),
            // 购买商品的标题，不同支付类型的长度要求不同，具体如下：微信扫码支付：128字节 支付宝扫码支付：128字节
            'product_title'=>'收款',
            // 购买商品的描述信息，要求128个字符内
            'product_desc'=>'收款满10减1',
            // 符合ISO 4217标准的三位字母代码，默认人民币：CNY
            'currency'=>'CNY',
            // 订单总金额，单位为分
            'amount'=>1,
            // 订单描述，要求300个字符内，不能包含特殊字符:英文逗号，注意：下载对账单会返回此字段数据
            'description'=>'扫码测试',
            // 交易类型:微信扫码支付:wechat_csb 支付宝扫码支付:alipay_csb 注:区分大小写
            'trade_type'=>'alipay_csb',
            // 订单生成时间，格式为yyyyMMddHHmmss
            'time_start'=>YhbUtil::getCurrentTimeYmdStr(),
            // 敏感字段加密时使用的密钥，如果报文中有敏感字段，此字段必传，注意:RSA加密之前密钥原文固定16个字节
            'encrypted_key'=>'',
            // 下单用户IP，可提高支付订单成功率
            'user_ip'=>'',
            // 异步通知地址，订单状态为成功或失败时都会通知该地址
            'notify_url'=>'',
            // 支付模式 为空或为1 则为 纯api模式 2 收银台模式
            'pay_mode'=>'',
            // 商品名称 支付模式为2 收银台模式时，此数值必填
            'partition_name'=>'',
            // 充值帐号 支付模式为2 收银台模式时，此数值必填
            'game_account'=>'',
            // 前台通知URL 支付模式 为2 收银台模式时，平台才会同步通知该URL
            'front_url'=>'',
            // 分账订单明细
            'splitDetails'=>json_encode($splitDetails_data)
        );
        echo self::_request(PayConfig::$API_BASE_URL.PayConfig::$ORDER_CREATE,$req_data);
    }

    /**
     * 订单查询
     */
    public function orderQuery(){
        $this->initSignConfig();

        $req_data=array(
            // 商户系统内部订单号
            'merchant_order_no'=>'',
            // 支付平台支付平台订单号
            'order_no'=>'PD201911081009355181265408000',
        );
        echo self::_request(PayConfig::$API_BASE_URL.PayConfig::$ORDER_QUERY,$req_data);
    }

    /**
     * 退款申请
     */
    public function orderRefundApply(){
        $this->initSignConfig();

        $req_data=array(
            // 商户系统内部订单号，要求64个字符内，只能是数字、大小写字母_-|* 且在同一个商户号下唯一
            'merchant_refund_order_no'=>YhbUtil::createUniqid(),
            // 退款金额，单位为分
            'amount'=>1,
            // 订单生成时间，格式为yyyyMMddHHmmss
            'merchant_refund_apply_time'=>YhbUtil::getCurrentTimeYmdStr(),
            // 订单描述，要求300个字符内，不能包含特殊字符:英文逗号，注意：下载对账单会返回此字段数据
            'description'=>'扫码测试',
            // 注意:商户原订单号或平台原订单号至少有一个数值不允许为空值
            // 商户原订单号
            'merchant_order_no'=>'',
            // 平台原订单号
            'order_no'=>'PD201911090027111002243764224',
            // 异步通知地址，订单状态为成功或失败时都会通知该地址
            'notify_url'=>''
        );
        echo self::_request(PayConfig::$API_BASE_URL.PayConfig::$REFUND_APPLY,$req_data);
    }

    /**
     * 退款查询
     */
    public function orderRefundQuery(){
        $this->initSignConfig();

        $req_data=array(
            // 注意：以下4个参数必须有一个不允许为空值
            // 商户系统内部订单号
            'merchant_order_no'=>'',
            // 支付平台支付平台订单号
            'order_no'=>'',
            // 商户系统退款订单号
            'merchant_refund_order_no'=>'',
            // 支付平台支付平台退款订单号
            'refund_order_no'=>'PR201911090027371111819956224'
        );
        echo self::_request(PayConfig::$API_BASE_URL.PayConfig::$REFUND_QUERY,$req_data);
    }

    /**
     * 交易订单明细查询
     */
        public function tradeDetailQuery(){
            $this->initSignConfig();

            $req_data=array(
                // 第几页
                'pageNum'=>1,
                // 每页条数
                'pageSize'=>50,
                // 开始时间 格式：yyyy-MM-dd HH:mm:ss
                'startTime'=>'',
                // 结束时间 格式：yyyy-MM-dd HH:mm:ss
                'endTime'=>'',
            );
            echo self::_request(PayConfig::$API_BASE_URL.PayConfig::$TRADE_DETAIL_QUERY,$req_data);
        }


    /**
     * 初始化签名信息
     */
    private function initSignConfig(){
        //支付平台支付平台提供给商户的SecretKey，登录支付平台支付平台查看
        // 需要替换为实际的数值
        SignConfig::setSecretKey("d0333800ea0d4d839b0ebd249f06c756");
        //商户自己的私钥[公钥通过登录支付平台支付平台进行配置，私钥设置到下面的变量中]
        //样例 见 merchant_rsa_private_key.pem
        // 需要替换为实际的数值
        SignConfig::setPrivateKeyPath("merchant_rsa_private_key.pem");
        //支付平台支付平台提供给商户的公钥，响应结果验签使用，登录支付平台支付平台查看,把它保存到一个pem文件中
        //样例 见 yhb_rsa_public_key.pem
        // 需要替换为实际的数值
        SignConfig::setYhbPublicKeyPath("yhb_rsa_public_key.pem");
    }
}

// 支付平台公钥转换方法
$rsaUtil = new RSAUtil();
// JAVA 格式公钥数值 请将转换后的支付平台公钥数值替换到 yhb_rsa_public_key.pem 文件中
$java_rsa_public_key="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoQz33a/TYNYkp6Vp/3Bjl0zj1aQpxGvuicY+J+214YO+RCtwypsFl96XXNkho/oI2N/p5JBvXjHOFK/ZaqzrGibJQNsKLp5liBt7JRbodPGXRdcizsmqzNtrMzevs/dSATZ6jTxrvDqM/4vWhSNl4f8nn48gPocjUlxqbWSTk6ZdIIloCKTwz7YAUIEOqQLJSs9odfpveWTxMwE5+vC/Q1OCpv5Ifxe1KPkSuEw7lBeDZq3G8/8SLnvOMhnnX1AXSey3Apj7UPSQYaY9XkCFlETuhuas+iq/VwXs/brJveZKsuXPRd+/A57q4olc6mu+qXSXjVv94fwEE8ZYNE9U+QIDAQAB";
echo "JAVA 格式公钥数值转换为PHP格式公钥数值:\n".$rsaUtil->Java2PhpRSAPublicKey($java_rsa_public_key);

//$chargeObj = new PayExample();
// 下单
//$chargeObj->orderCreate();
// 订单查询
//$chargeObj->orderQuery();
// 退款申请
//$chargeObj->orderRefundApply();
// 退款查询
//$chargeObj->orderRefundQuery();
// 交易明细查询
//$chargeObj->tradeDetailQuery();
